perm filename APPLY.SAI[SYS,HE]2 blob sn#036129 filedate 1973-04-17 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00027 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00004 00002	BEGIN "APPLY"
C00007 00003	α	define display areas
C00010 00004	α	miscelaneous dpy procedures
C00012 00005	α	more misc. display routines
C00015 00006	α	display outline (frame 0)
C00018 00007	α	generate TV parameters (frame 6)
C00020 00008	α	generate position parameters (frame 5)
C00021 00009	α	generate window display (frame 7)
C00023 00010	α	generate instruction area (frames 1-3,10-12)
C00026 00011	α	generate operator display (frame 8)
C00028 00012	α	display operator output and parameters (frame 9)
C00032 00013	α  conversion from Quam format to H/E format
C00036 00014	α	BEGINNING OF TVSIX PACKAGE
C00039 00015	α	TVSIX REDUCTION ROUTINE
C00040 00016	α Super fast averager.  SUMS and CLPINC determine the number of 
C00042 00017	α	read the TV camera as specified
C00044 00018	α	ouput window to DDVID channel
C00047 00019	α	setup TV limits for reading
C00049 00020	α	read double resolution TV picture
C00051 00021	α	move window
C00053 00022	α	read a disk file
C00056 00023	α	command table
C00059 00024	α  tables containing the above magic numbers and strings
C00061 00025	α	main program begins here
C00063 00026	α	command loop - decode input
C00065 00027	α	command case statement
C00069 ENDMK
C⊗;
BEGIN "APPLY"
REQUIRE "DPYSUB.HDR[1,PDQ]" SOURCE_FILE;
REQUIRE "DPYOPS.HDR[1,PDQ]" SOURCE_FILE;
REQUIRE "EDGLIB[SYS,HE]" LIBRARY;
REQUIRE "HELIB[1,3]" LIBRARY;
REQUIRE "SAITRG.HDR[1,PDQ]" SOURCE_FILE;
REQUIRE "⊂⊃||" DELIMITERS;

STRING BLANKS, CHAR;
DEFINE CRLF=⊂'15&'12⊃, α=⊂COMMENT⊃, EXT=⊂EXTERNAL⊃, RF=⊂REFERENCE⊃;
EXT INTEGER IWID, LINLEN, FLINE, LLINE, LSIDE, RSIDE, TVWORD, TMAX,
	BMAX, LSMAX, RSMAX;
EXT BOOLEAN STV, STVFL, ST, SLIM, HOFF, VOFF, ISEDGE, ISLINE, BCOMP,
	WEAK, NOISY, NEARED, OPOOB;
EXT REAL B, TM, TP, N0SQ, S0SQ, COH, CX, CY, OPX, OPY, CIRCLE, LINWID,
	OPXM, OPYM, OPXP, OPYP;
INTERNAL INTEGER DAC_ACC, AUTO_ACC, GODDT, COMDDT;
INTERNAL REAL CONF, DIFF;
INTEGER  I, J, INTEG, STATUS, X, Y, FRAMES;
BOOLEAN FRACFLG, NUMFLG, OPER, CMNDFLG;
REAL FLTPNT, FRAC;
LABEL LOOP, NXT, NOIMP, ERR, TODDT, FRMDDT;

PRELOAD_WITH "CLEAR", "RED", "BLUE", "GREEN";
SAFE STRING ARRAY FILTER[1:4];

EXT INTEGER PROCEDURE DDACO(INTEGER DACR);
EXT PROCEDURE TVMOVE;
EXT PROCEDURE TVREAD;
EXT PROCEDURE CONV;
EXT PROCEDURE TVIN;
EXT PROCEDURE PICINI(INTEGER C,F,E,P;RF BOOLEAN FAIL;INTEGER ARRAY STOR);
EXT PROCEDURE PICRD(RF BOOLEAN FAIL; INTEGER ARRAY STOR);
EXT PROCEDURE INTPNT;
EXT INTEGER PROCEDURE GETPNT(INTEGER X,Y);
EXT PROCEDURE EJINIT(INTEGER SIZE);
EXT BOOLEAN PROCEDURE EJLI(INTEGER X,Y,ANGLE,FLAG);
EXT PROCEDURE PICWR(INTEGER C,F,E,P; RF BOOLEAN FAIL; INTEGER ARRAY STOR);
EXT BOOLEAN PROCEDURE DDVID(STRING CONSTR);
EXT PROCEDURE OVERL(INTEGER ARRAY DPYBUF; INTEGER N,M,L,EXP;BOOLEAN CH);
EXT INTEGER PROCEDURE JOBOK(RF INTEGER JOBNO);
EXT PROCEDURE ADJUST;
EXT INTEGER PROCEDURE GIOWD(INTEGER ARRAY A);
EXT INTEGER PROCEDURE POTABS(INTEGER CHAN; RF INTEGER FLAG);
EXT INTEGER PROCEDURE GETCOR(INTEGER SIZE);
EXT PROCEDURE RELCOR(INTEGER IOWD);
EXT INTEGER PROCEDURE SLINK(STRING NAME);
α	define display areas;

DEFINE XSIZ=⊂12⊃;	α x character increment;
DEFINE YSIZ=⊂24⊃;	α y character increment;
DEFINE MODLIN=⊂3⊃;	α # of lines in mode section;
DEFINE WINLIN=⊂21⊃;	α # of lines in window section;
DEFINE OPLIN=⊂8⊃;	α # of lines in operator section;
DEFINE PARWID=⊂19⊃;	α # of characters in parameter section;
DEFINE BLK=⊂2⊃;		α # of blank lines at top of page (for WHO);
DEFINE TOP=⊂512-BLK*YSIZ⊃;	α first line of display;

α	variables used to set up display;

BOOLEAN	DVDTST,		α TRUE if DDVID available;
	EDGTST,		α TRUE if edge follower available;
	DRES,		α TRUE if resolution doubled;
	CMODE;		α TRUE if camera mode;
INTEGER WX,		α X coordinate of operator center;
	WY,		α Y coordinate of operator center;
	DAC,		α last dac setting;
	AD,		α last A-D reading;
	AVE,		α # of frames to average in sixbit mode;
	RANG,		α # of ranges in sixbit mode;
	WT,		α top of window;
	WB,		α bottom of window;
	WL,		α left side of window;
	WR,		α right side of window;
	OPNUM;		α operator number;
EXT INTEGER TVCAM,	α camera number;
	BITS,		α bits per sample;
	BCLIP,		α bottom clip level;
	TCLIP;		α top clip level;
STRING	FILE;		α picture file name;

α  set up command display;

PROCEDURE COMON;
	BEGIN
	ACCPOG(1);
	IF CMODE THEN
		BEGIN
		ACCPOG(2);
		IF BITS=4 THEN ACCPOG(3);
		IF TVCAM=1 THEN ACCPOG(10);
		END;
	IF DVDTST THEN ACCPOG(11);
	IF EDGTST THEN ACCPOG(12);
	IF GODDT THEN ACCPOG(14);
	END;
α	miscelaneous dpy procedures;

α	deposit string S (5 characters or less) in dpy at PNTR;

SIMPLE PROCEDURE DPYDMP(INTEGER PNTR; STRING S; INTEGER FRAM);
	BEGIN
	PGSEL(FRAM);
	UPGMVM(CVASC(S) LOR 1, PNTR);
	END;

α	save location of dpy pointer;

DEFINE SAVLOC=⊂DPYPTR LAND '777777⊃;

α	make string S of length N;

SIMPLE STRING PROCEDURE MAKSTR(STRING S; INTEGER N);
	RETURN((S&BLANKS)[1 FOR N]);

α	decimal conversion of length N;

SIMPLE STRING PROCEDURE OUTDEC(INTEGER NUM, N);
	BEGIN
	SETFORMAT(N,0);
	RETURN(CVS(NUM)[1 FOR N]);
	END;

α	octal conversion of length N;

SIMPLE STRING PROCEDURE OUTOCT(INTEGER NUM, N);
	BEGIN
	SETFORMAT(N,0);
	RETURN(CVOS(NUM)[1 FOR N]);
	END;

α	real conversion of length 5, fraction of length M;

SIMPLE STRING PROCEDURE OUTRL(REAL VAL; INTEGER M);
	BEGIN STRING S;
	SETFORMAT(6,M);
	S ← CVF(VAL);
	S ← IF S[1 FOR 1]=" " THEN S[2 FOR 5] ELSE S[1 FOR 5];
	RETURN(S);
	END;
α	more misc. display routines;

SIMPLE PROCEDURE DDOCT(STRING STR;REFERENCE INTEGER SAV,NUM);
	BEGIN
	DPYSTR(X,Y←Y-YSIZ,MAKSTR(STR&"=     ",8));
	RIVECT(0,0);
	DPYSST(OUTOCT(NUM,5));
	SAV ← SAVLOC;
	END;
SIMPLE PROCEDURE DDDEC(STRING STR;REFERENCE INTEGER SAV,NUM);
	BEGIN
	DPYSTR(X,Y←Y-YSIZ,MAKSTR(STR&"=     ",8));
	RIVECT(0,0);
	DPYSST(OUTDEC(NUM,5));
	SAV ← SAVLOC;
	END;

SIMPLE STRING PROCEDURE DRL(REAL VAL;INTEGER N);
	RETURN(IF VAL≠-1000.0 THEN OUTRL(VAL,N) ELSE "     ");


SIMPLE PROCEDURE DDDEP(STRING STR; REAL NUM; INTEGER N);
	DPYSTR(X,Y←Y-YSIZ,MAKSTR(STR&"=     ",8)&DRL(NUM,N));

SIMPLE PROCEDURE DDDEPB(STRING STR; BOOLEAN V);
	DPYSTR(X,Y←Y-YSIZ,MAKSTR(STR&"=     ",8)&
		(IF V THEN "TRUE " ELSE "FALSE"));

α	turn on and off display frames;

DEFINE F0=⊂'400000000000⊃, F1=⊂'200000000000⊃, F2=⊂'100000000000⊃,
	F3=⊂'40000000000⊃, F4=⊂'20000000000⊃, F5=⊂'10000000000⊃,
	F6=⊂'4000000000⊃, F7=⊂'2000000000⊃, F8=⊂'1000000000⊃,
	F9=⊂'400000000⊃, F10=⊂'200000000⊃, F11=⊂'100000000⊃,
	F12=⊂'40000000⊃, F13=⊂'20000000⊃, F14=⊂'10000000⊃;

SIMPLE PROCEDURE DPYOFF(INTEGER FRAM);
	BEGIN
	FRAMES ← FRAMES LAND (LNOT FRAM);
	ACPOGS(FRAMES);
	IF CMNDFLG THEN COMON;
	END;

SIMPLE PROCEDURE DPYON(INTEGER FRAM);
	BEGIN
	FRAMES ← FRAMES LOR FRAM;
	ACPOGS(FRAMES);
	IF CMNDFLG THEN COMON;
	END;
α	display outline (frame 0);

PROCEDURE DOUT;
	BEGIN INTEGER ARRAY B[1:50];
	DPYSET(B);
	DPYBRT(3);
	AIVECT(-512,TOP-MODLIN*YSIZ);
	AVECT(-512+WINLIN*XSIZ*2,TOP-MODLIN*YSIZ);
	AIVECT(-512,TOP-MODLIN*YSIZ);
	RVECT(0,-WINLIN*YSIZ);
	AVECT(500,TOP-(WINLIN+MODLIN)*YSIZ);
	AIVECT(-512+WINLIN*XSIZ*2,TOP);
	AVECT(-512+WINLIN*XSIZ*2,TOP-(MODLIN+WINLIN)*YSIZ);
	AIVECT(-512+(WINLIN*2+PARWID)*XSIZ,TOP-(MODLIN+WINLIN)*YSIZ);
	AVECT(-512+(WINLIN*2+PARWID)*XSIZ,TOP);
	AIVECT(-512,TOP-(MODLIN+WINLIN+OPLIN)*YSIZ);
	AVECT(500,TOP-(MODLIN+WINLIN+OPLIN)*YSIZ);
	DPYOUT(0);
	FRAMES ← FRAMES LOR F0;
	END;

α	display modes (frame 4);

PROCEDURE DMOD;
	BEGIN INTEGER ARRAY B[1:50];
	STRING S;
	DPYSET(B);
	DPYBRT(5);
	DPYBIG(2);
	S ← IF CMODE THEN "CAMERA: "&OUTDEC(TVCAM,2) ELSE "FILE: "&FILE;
	DPYSTR(-512,TOP,CRLF&S&CRLF);
	S ← "BITS: "&OUTDEC(BITS,2);
	IF BITS=6 THEN S←S&OUTDEC(AVE,5)&"/"&OUTDEC(RANG,2);
	S ← MAKSTR(S,20)&"AVAILABLE: ";
	IF DVDTST THEN S←S&"DDVID" ELSE IF EDGTST THEN S←S&"EDGE" ELSE
		IF GODDT THEN S←S&"DDT";
	DPYSST(S&CRLF);
	S ← MAKSTR("RESOLUTION: "&(IF DRES THEN "DOUBLE" ELSE "NORMAL"),25);
	IF DVDTST∧EDGTST THEN S←S&"EDGE";
	IF (DVDTST∨EDGTST)∧GODDT THEN S←S&"   DDT";
	DPYSST(S);
	DPYOUT(4);
	FRAMES ← FRAMES LOR F4;
	END;
α	generate TV parameters (frame 6);

α	pointers to dpy words to be modified;

INTEGER XO,	α X (octal);
	XD,	α X (decimal);
	YO,	α Y (octal);
	YD,	α Y (decimal);
	WTO,	α top of window (octal);
	WBO,	α bottom of window (octal);
	WLO,	α left side of window (octal);
	WRO,	α right side of window (octal);
	WTD,	α top of window (decimal);
	WBD,	α bottom of window (decimal);
	WLD,	α left side of window (decimal);
	WRD,	α right side of window (decimal);
	DOPNUM,	α operator number;
	BC,	α BCLIP;
	TC,	α TCLIP;
	DACS,	α DAC setting;
	ADS;	α A-D reading;

DEFINE DEPOCT(STR,SAV,NUM)=⊂DDOCT("STR",SAV,NUM)⊃,
	DEPDEC(STR,SAV,NUM)=⊂DDDEC("STR",SAV,NUM)⊃,
	POSIT=⊂AIVECT(X,Y←Y-YSIZ)⊃;

PROCEDURE TVPAR;
	BEGIN INTEGER ARRAY B[1:50];
	DPYSET(B);
	DPYBRT(5);
	DPYBIG(2);
	X ← -512+WINLIN*XSIZ*2;
	Y ← TOP-15*YSIZ;
	DEPDEC(TCLIP,TC,TCLIP);
	DEPDEC(BCLIP,BC,BCLIP);
	DEPDEC(DAC,DACS,DAC);
	DEPDEC(AD,ADS,AD);
	FRAMES ← FRAMES LOR F6;
	DPYOUT(6);
	END;
α	generate position parameters (frame 5);

PROCEDURE POSPAR;
	BEGIN
	INTEGER ARRAY B[1:100];
	DPYSET(B);
	DPYBRT(5);
	DPYBIG(2);
	X ← -512+WINLIN*XSIZ*2;
	Y ← TOP;
	POSIT;
	DPYSST("     octal");
	DEPOCT(X,XO,WX);
	DEPOCT(Y,YO,WY);
	DEPOCT(TOP,WTO,WT);
	DEPOCT(BOTTOM,WBO,WB);
	DEPOCT(LEFT,WLO,WL);
	DEPOCT(RIGHT,WRO,WR);
	POSIT;
	DPYSST("    decimal");
	DEPDEC(X,XD,WX);
	DEPDEC(Y,YD,WY);
	DEPDEC(TOP,WTD,WT);
	DEPDEC(BOTTOM,WBD,WB);
	DEPDEC(LEFT,WLD,WL);
	DEPDEC(RIGHT,WRD,WR);
	DEPDEC(OPNUM,DOPNUM,OPNUM);
	FRAMES ← FRAMES LOR F5;
	DPYOUT(5);
	END;
α	generate window display (frame 7);

PROCEDURE DWIND;
	BEGIN
	INTEGER ARRAY B[1:1000];
	INTEGER X,Y,YY,PTR, I, J;
	DPYSET(B);
 	DPYBRT(1);
 	DPYBIG(1);
	Y ← 36 DIV BITS;
	X ← WL-LSIDE;
	I ← X DIV Y;
	J ← X MOD Y;
	PTR←(POINT(BITS,Y,IF J THEN J*BITS-1 ELSE -1) LAND '777777000000)+
		((TVWORD+1) LAND '777777)+(WT-FLINE)*LINLEN+I;
	YY ← TOP-MODLIN*YSIZ+4;
	FOR Y ← WT STEP 1 UNTIL WB DO
		BEGIN 
		AIVECT(-512,YY←YY-YSIZ);

		START_CODE
		LABEL L1, L2, L3, L4, L5, L6, FIXUP;
		MOVEI 1,20;
		MOVEI 2,5;
		MOVE 3,PTR;
L1:		LSH 4,7;
		IORI 4,'40;
		SOJG 2,L2;
		PUSHJ '17,FIXUP;
L2:		ILDB 5,3;
		IDIVI 5,10;
		ADDI 6,'60;
		JUMPE 5,L3;
		ADDI 5,'60;
		JRST L4;
FIXUP:		LSH 4,1;
		IORI 4,1;
		AOS DPYPTR;
		MOVEM 4,@DPYPTR;
		MOVEI 2,5;
		POPJ '17,0;
L3:		MOVEI 5,(6);
		MOVEI 6,'40;
L4:		LSH 4,7;
		IORI 4,(5);
		SOJG 2,L5;
		PUSHJ '17,FIXUP;
L5:		LSH 4,7;
		IORI 4,(6);
		SOJG 2,L6;
		PUSHJ '17,FIXUP;
L6:		SOJGE 1,L1;
		END;

		PTR ← PTR+LINLEN;
		END;
	FRAMES ← FRAMES LOR F7;
	DPYOUT(7);
	END;
α	generate instruction area (frames 1-3,10-12);

PROCEDURE DINST;
	BEGIN INTEGER ARRAY B[1:300];
	DEFINE DPY(S)=⊂DPYSTR(X,Y←Y-YSIZ,"S")⊃;
	X ← -512+(WINLIN*2+PARWID)*XSIZ;
	Y ← 512;

α	general commands;

	DPYSET(B);
	DPYBRT(4);
	DPYBIG(2);
	DPY(|   ?  comp. inst. dpy|);
	DPY(|   M  move window|);
	DPY(|<n>↑  move pntr up n|);
	DPY(|<n>↓  move pntr down n|);
	DPY(|<n>←  move pntr left n|);
	DPY(|<n>→  move pntr right n|);
	DPY(|<n>O  apply operator n|);
	DPY(|<n>C  camera mode (TV n)|);
	DPY(|   R  read a disk file|);
	DPY(|  nY  change CONF to n|);
	DPY(|  nZ  change DIF to n|);
	DPYOUT(1);

α	camera mode commands;

	DPYSET(B);
	DPYBRT(4);
	DPYBIG(2);
	DPY(|   S  six bit images|);
	DPY(|   F  four bit images|);
	DPY(|   W  write window|);
	DPY(|   H  show window|);
	DPYOUT(2);

α	four bit mode and camera mode;

	DPYSET(B);
	DPYBRT(4);
	DPYBIG(2);
	DPY(|   I  double resolution|);
	DPY(|   N  resolution←normal|);
	DPY(|  nB  change BCLIP to n|);
	DPY(|  nT  change TCLIP to n|);
	DPYOUT(3);

α	camera 1 mode;

	DPYSET(B);
	DPYBRT(4);
	DPYBIG(2);
	DPY(|  nD  DAC←n|);
	DPYOUT(10);

α	DDVID available;

	DPYSET(B);
	DPYBRT(4);
	DPYBIG(2);
	DPY(|  V  image to DDVID|);
	DPYOUT(11);

α	RAID available;

	DPYSET(B);
	DPYBRT(4);
	DPYBIG(2);
	DPY(|  X  go to RAID|);
	DPYOUT(14);
	
α	EDGE available;

	DPYSET(B);
	DPYBRT(4);
	DPYBIG(2);
	DPY(|  T  trace line|);
	DPY(|  A  accomodate|);
	DPY(|  E  exit|);
	DPYOUT(12);
	END;
α	generate operator display (frame 8);

PROCEDURE DOPOUT;
	BEGIN INTEGER ARRAY B[1:200];
	DEFINE XPOS(X)=⊂-512+(((X)-WL)*2+1)*XSIZ⊃,
		YPOS(Y)=⊂TOP-(MODLIN+(Y)+1-WT)*YSIZ+(YSIZ DIV 2)⊃;
	DPYSET(B);
	DPYBRT(7);
	MKCIRCLE(CIRCLE*YSIZ,XPOS(WX),YPOS(WY),25);
	IF OPX≠-1000.0∧OPY≠-1000.0 THEN
		BEGIN
		AIVECT(XPOS(|OPX-CIRCLE*CY|),YPOS(|OPY+CIRCLE*CX|));
		AVECT(XPOS(|OPX+CIRCLE*CY|),YPOS(|OPY-CIRCLE*CX|));
		END;
	DPYBRT(1);
	IF OPXP≠-1000.0∧OPYP≠-1000.0 THEN
		BEGIN
		AIVECT(XPOS(|OPXP-CIRCLE*CY|),YPOS(|OPYP+CIRCLE*CX|));
		AVECT(XPOS(|OPXP+CIRCLE*CY|),YPOS(|OPYP-CIRCLE*CX|));
		END;
	IF OPXM≠-1000.0∧OPYM≠-1000.0 THEN
		BEGIN
		AIVECT(XPOS(|OPXM-CIRCLE*CY|),YPOS(|OPYM+CIRCLE*CX|));
		AVECT(XPOS(|OPXM+CIRCLE*CY|),YPOS(|OPYM-CIRCLE*CX|));
		END;
	DPYOUT(8);
	FRAMES ← FRAMES LOR F8;
	END;

α	display operator pointer (frame 13);

PROCEDURE DPNTR;
	BEGIN INTEGER ARRAY B[1:10];
	INTEGER I;
	STRING S;
	SETFORMAT(0,0);
	DPYSET(B);
	DPYBRT(7);
	DPYBIG(1);
	S ← CVS(GETPNT(WX-LSIDE,WY-FLINE));
	I ← LENGTH(S);
	DPYSTR(-512+(WX-WL)*2*XSIZ+8,TOP-(1+MODLIN+WY-WT)*YSIZ+4,S);
	FRAMES ← FRAMES LOR F13;
	DPYOUT(13);
	END;
α	display operator output and parameters (frame 9);

DEFINE DEPB(STR)=⊂DDDEPB("STR",STR)⊃, DEP(STR,N)=⊂DDDEP("STR",STR,N)⊃;

PROCEDURE DOPPAR;
	BEGIN INTEGER ARRAY BB[1:400];
	DPYSET(BB);
	DPYBRT(5);
	DPYBIG(2);
	X ←-500;
	Y ←TOP-(MODLIN+WINLIN)*YSIZ;
	DEPB(OPER);
	DEPB(WEAK);
	DEPB(NOISY);
	DEPB(OPOOB);
	DEPB(ISLINE);
	DEPB(ISEDGE);
	DEPB(NEARED);
	DEPB(BCOMP);
	X ← -500+18*XSIZ;
	Y ← TOP-(MODLIN+WINLIN)*YSIZ;
	DEP(CONF,2);
	DEP(DIFF,1);
	DEP(COH,3);
	DEP(S0SQ,2);
	DEP(N0SQ,2);
	DEP(B,1);
	DEP(B+TM,1);
	DEP(B+TM+TP,1);
	X ← -500+18*2*XSIZ;
	Y ← TOP-(MODLIN+WINLIN)*YSIZ;
	DEP(OPXP,1);
	DEP(OPYP,1);
	DEP(OPXM,1);
	DEP(OPYM,1);
	DEP(CX,3);
	DEP(CY,3);
	X ← -500+18*3*XSIZ;
	Y ← TOP-(MODLIN+WINLIN)*YSIZ;
	DEP(OPX,1);
	DEP(OPY,1);
	DEP(LINWID,2);
	FRAMES ← FRAMES LOR F9;
	DPYOUT(9);
	END;
α  conversion from Quam format to H/E format;

REQUIRE "PROLOG.HDR[1,PDQ]" SOURCE_FILE;
REQUIRE "VIDSUB[1,PDQ]" LOAD_MODULE;
DEFINE Q=⊂'10000⊃;
EXTERNAL INTEGER LINES;
EXT PROCEDURE SUMSUB(INTEGER ARRAY TV; INTEGER O1, O2, O3);
INTEGER SUMPT1, SUMPT2, SUMPT3, TVSIZE, MINV, MAXV;

SIMPLE PROCEDURE Q2HE(SAFE INTEGER ARRAY PIC);
	BEGIN
	IWID←PIC[SIZEX];
	FLINE←PIC[POSY];
	LSIDE←PIC[POSX];
	RSIDE←LSIDE+IWID-1;
	LLINE←FLINE+PIC[SIZEY]-1;
	LINLEN←PIC[SIZEL];
	BITS←PIC[BIT];
	END "Q2HE";

α  Conversion from hand-eye library parameters to Quam format picture
	header array;

SIMPLE PROCEDURE HE2Q(SAFE INTEGER ARRAY PIC);
	BEGIN
	PIC[SCALEX]←PIC[SCALEY]←1;
	PIC[POSX]←LSIDE;
	PIC[POSY]←FLINE;
	PIC[SIZEX]←RSIDE-LSIDE+1;
	PIC[SIZEY]←LLINE-FLINE+1;
	PIC[SIZEL]←HAT(PIC[SIZEX],36 DIV BITS);
	PIC[BIT]←BITS;
END "HE2Q";
α	BEGINNING OF TVSIX PACKAGE;

SIMPLE PROCEDURE MINMAX(SAFE INTEGER ARRAY PARS);
	BEGIN INTEGER NI,NJ;
	NI←LINLEN*3;
	NJ←PARS[SIZEY];

	START_CODE
	LABEL LI,LJ;
	DEFINE A=⊂1⊃,I=⊂2⊃,J=⊂3⊃,P1=⊂4⊃,P2=⊂5⊃,P3=⊂6⊃;
	DEFINE FOO(X)=⊂
		ILDB A,X;
		CAMGE A,MINV;
		MOVEM A,MINV;
		CAMLE A,MAXV;
		MOVEM A,MAXV;⊃;

	MOVE P1,SUMPT1;
	MOVE P2,SUMPT2;
	MOVE P3,SUMPT3;
	MOVE J,NJ;
LJ:	MOVE I,NI;
LI:	FOO(P1)
	FOO(P2)
	FOO(P3)
	SOJG I,LI;
	SOJG J,LJ;
	END;
	END "MINMAX";
α	TVSIX REDUCTION ROUTINE;

SIMPLE PROCEDURE REDUCER(SAFE INTEGER ARRAY PARS);
	BEGIN
	INTEGER NI,NJ,RPT,LL,SCALE;
	SCALE←(64*Q-1)%(MAXV-MINV);
	NI←3*LINLEN;
	NJ←PARS[SIZEY];
	RPT←PARS[PTR];
	LL←PARS[SIZEL];

	START_CODE
	LABEL L,LI;
	DEFINE A=⊂1⊃,I=⊂2⊃,J=⊂3⊃,P1=⊂4⊃,P2=⊂5⊃,P3=⊂6⊃,R=⊂7⊃;
	DEFINE FOO(X)=⊂
		ILDB A,X;
		SUB A,MINV;
		IMUL A,SCALE;
		ASH A,'777764;
		IDPB A,R;⊃;

	MOVE P1,SUMPT1;
	MOVE P2,SUMPT2;
	MOVE P3,SUMPT3;
	MOVE R,RPT;
	MOVE J,NJ;
LI:	MOVE I,NI;
L:	FOO(P1)
	FOO(P2)
	FOO(P3)
	SOJG I,L;
	MOVE R,LL;
	ADDB R,RPT;
	SOJG J,LI;
	END;

	END "REDUCER";
α Super fast averager.  SUMS and CLPINC determine the number of 
	averages and clip level ranges;

PROCEDURE SUMMER(INTEGER ARRAY PARS,SUM;INTEGER SUMS,CLPINC);
	BEGIN
	LINLEN←(PARS[SIZEX]-1)%9+1;
	TVSIZE←LINLEN*LINES;
		BEGIN INTEGER ARRAY TVBUF[1:TVSIZE];
		INTEGER SUMCNT;
		SUMPT1←POINT(12,SUM[1,1,1],-1);
		SUMPT2←SUMPT1+TVSIZE;
		SUMPT3←SUMPT2+TVSIZE;
		MINV←1 LSH 34;
		MAXV←0;
		TVWORD←GIOWD(TVBUF);
		FOR SUMCNT←1 STEP 1 UNTIL SUMS DO
			BEGIN
			TCLIP←0;
			BCLIP←CLPINC-1;
			WHILE BCLIP ≤ 7 DO
				BEGIN
				TVIN;
				SUMSUB(TVBUF,SUMPT1,SUMPT2,SUMPT3);
				TCLIP←TCLIP+CLPINC;
				BCLIP←BCLIP+CLPINC;
				END;
			END;
		END;
	END "SUMMER";

PROCEDURE TVSIX(SAFE INTEGER ARRAY PARS;INTEGER SUMS,CLPINC);
	BEGIN INTEGER ADR, TVSAV;
	PARS[SIZEL]←(PARS[SIZEX]-1)%6+1;
	TVSAV ← TVWORD;
	ADR←(TVWORD+1) LAND '777777;
	PARS[PTR]←XPOINT(6,ADR,-1);
	PARS[BIT]←6;
	Q2HE(PARS);
	LINLEN←(PARS[SIZEX]-1)%9+1;
	LINES←LLINE-FLINE+1;
		BEGIN INTEGER ARRAY SUM[1:3,1:LINES,1:LINLEN];
		SUMMER(PARS,SUM,SUMS,CLPINC);
		MINMAX(PARS);
		REDUCER(PARS);
		END;
	TVWORD ← TVSAV;
	TCLIP ← 0;
	BCLIP ← 7;
	END "TVSIX";
α	read the TV camera as specified;

FORWARD PROCEDURE DBLTV;

PROCEDURE READTV;
	BEGIN
	IF BITS=4 THEN IF DRES THEN DBLTV ELSE TVIN;
	IF BITS=6 THEN
		BEGIN INTEGER ARRAY PIC[0:9];
		HE2Q(PIC);	
		TVSIX(PIC,AVE,RANG);
		Q2HE(PIC);
		END;
	END;

α	apply operator;

SIMPLE PROCEDURE APLYOP;
	BEGIN INTEGER I;
	WEAK←NOISY←OPOOB←ISLINE←ISEDGE←BCOMP←FALSE;
	COH←S0SQ←N0SQ←B←OPXP←OPYP←OPXM←OPYM←CX←CY←OPX←OPY←LINWID←-1000.0;
	TP ← TM ← 0.0;
	OPER ← EJLI(WX, WY, I, I);
	DOPPAR;
	DOPOUT;
	END;

α	move window pointer by n,m units;

SIMPLE PROCEDURE MOVPTR(INTEGER X,Y);
	BEGIN
	WX←((WX+X) MIN WR) MAX WL;
	WY←((WY+Y) MIN WB) MAX WT;
	IF X≠0 THEN
		BEGIN
		DPYDMP(XO,OUTOCT(WX,5),5);
		DPYDMP(XD,OUTDEC(WX,5),5);
		END;
	IF Y≠0 THEN
		BEGIN
		DPYDMP(YO,OUTOCT(WY,5),5);
		DPYDMP(YD,OUTDEC(WY,5),5);
		END;
	DPNTR;
	END;
α	ouput window to DDVID channel;

PROCEDURE WINDOW;
	BEGIN SAFE INTEGER ARRAY B[1:20];
	DPYSET(B);
	AIVECT(0,0);
	RVECT(IWID-1,0);
	RVECT(0,BMAX-TMAX);
	RVECT(-IWID+1,0);
	RVECT(0,TMAX-BMAX);
	AIVECT(WL-LSMAX,WT-TMAX);
	RVECT(0,19);
	RVECT(19,0);
	RVECT(0,-19);
	RVECT(-19,0);
	DPYPARS;
	OVERL(B,1,1,0,IF ((BMAX-TMAX) MAX (RSMAX-LSMAX))*4< 950
		THEN 2 ELSE 1,FALSE);
	END;

α	disk output;

PROCEDURE WRITEOUT;
	BEGIN LABEL REDO;
	INTEGER EXTEN, PPN, S, FAIL, I, J;
	STRING STR, TITLE, DEFS;
	SAFE INTEGER ARRAY STOR[1:25],TIT[1:3];
REDO:	OUTSTR("FILE=");
	STR ← INCHWL;
	TITLE ← "APPLY OUTPUT   ";
	FOR J←1 STEP 1 UNTIL 3 DO TIT[J]←CVASC(TITLE[(J-1)*5+1 FOR 5]);
	STOR[1] ← TVWORD+1;
	STOR[5] ← GIOWD(TIT)+1;
	SETFORMAT(0,0);
	DEFS ← "CAMERA: "&CVS(TVCAM)&CRLF&
		"RESOLUTION: "&(IF DRES THEN "DOUBLE" ELSE "NORMAL")&CRLF&
		"TCLIP: "&CVS(TCLIP)&CRLF&"BCLIP: "&CVS(BCLIP)&CRLF&
		"DAC: "&CVS(DAC)&CRLF;
	I ← LENGTH(DEFS);
	IF (I MOD 5) THEN MAKSTR(DEFS,((I DIV 5)+1) %5);
	I ← LENGTH(DEFS) DIV 5;
		BEGIN SAFE INTEGER ARRAY D[1:I];
		FOR J←1 STEP 1 UNTIL I DO D[J]←CVASC(DEFS[(J-1)*5+1 FOR 5]);
		STOR[6] ← GIOWD(D)+1;
		PICWR(1,CVFIL(STR,EXTEN,PPN),EXTEN,PPN,FAIL,STOR);
		END;
	IF FAIL THEN BEGIN OUTSTR(" WRITE FAILED "); GO TO REDO; END;
	END;
α	setup TV limits for reading;

INTEGER T_,B_,L_,R_,I_,LL_;

PROCEDURE TODBL;
	BEGIN
	I_ ← IWID;
	LL_ ← LINLEN;
	T_ ← FLINE;
	B_ ← LLINE;
	R_ ← RSIDE;
	L_ ← LSIDE;
	FLINE ← FLINE+5;
	LLINE ← LLINE-5;
	RSIDE ← RSIDE-5;
	LSIDE ← LSIDE+5;
	END;

PROCEDURE FRMDBL;
	BEGIN
	FLINE ← T_;
	LLINE ← B_;
	RSIDE ← R_;
	LSIDE ← L_;
	IWID ← I_;
	LINLEN ← LL_;
	END;

PROCEDURE ADJTV;
	BEGIN
	IF DRES THEN TODBL;
	TVMOVE;
	IF DRES THEN FRMDBL;
	END;

α	change window limit variables in display;

PROCEDURE WINDUP;
	BEGIN
	DPYDMP(WTD,OUTDEC(WT,5),5);
	DPYDMP(WTO,OUTOCT(WT,5),5);
	DPYDMP(WBO,OUTOCT(WB,5),5);
	DPYDMP(WBD,OUTDEC(WB,5),5);
	DPYDMP(WLD,OUTDEC(WL,5),5);
	DPYDMP(WLO,OUTOCT(WL,5),5);
	DPYDMP(WRO,OUTOCT(WR,5),5);
	DPYDMP(WRD,OUTDEC(WR,5),5);
	END;
α	read double resolution TV picture;

PROCEDURE DBLTV;
	BEGIN INTEGER P1, P2, P3, P4, PT, TVW;
	SAFE INTEGER ARRAY T1, T2, T3, T4[1:40];
	TODBL;
	TVW ← TVWORD;
	TVWORD ← GIOWD(T1); HOFF ← VOFF ← FALSE; TVIN;
	TVWORD ← GIOWD(T2); HOFF ← TRUE; TVIN;
	TVWORD ← GIOWD(T3); HOFF ← FALSE; VOFF ← TRUE; TVIN;
	TVWORD ← GIOWD(T4); HOFF ← TRUE; TVIN;
	TVWORD ← TVW;
	FRMDBL;
	VOFF ← HOFF ← FALSE;
	P1 ← POINT(4,T1[1],-1);
	P2 ← POINT(4,T2[1],-1);
	P3 ← POINT(4,T3[1],-1);
	P4 ← POINT(4,T4[1],-1);
	PT ← XPOINT(4,(TVWORD+1) LAND '777777,-1);
		START_CODE
		LABEL L1, L2, L3, L4;
		MOVE 1,PT;
		MOVEI 6,10;
L4:		MOVEI 5,1;
		MOVE 2,P1;
		MOVE 3,P2;
L3:		MOVEI 7,10;
L1:		ILDB 8,2;
		IDPB 8,1;
		ILDB 8,3;
		IDPB 8,1;
		SOJG 7,L1;
		MOVEI 1,3;
		ADDB 1,PT;
		SOJL 5,L2;
		MOVE 2,P3;
		MOVE 3,P4;
		JRST L3;

L2:		MOVEI 2,2;
		ADDM 2,P1;
		ADDM 2,P2;
		ADDM 2,P3;
		ADDM 2,P4;
		SOJG 6,L4;
		END;
	END;
α	move window;

PROCEDURE MOVE_WINDOW;
	BEGIN 
	INTEGER FLG, T, B, L, R, I, TM, BM, LM, RM, TS;
	TS ← BITS;
	IF CMODE THEN BEGIN TM←LM←0;RM←333;BM←256;ADJTV;END ELSE
		BEGIN TM ← TMAX; BM ← BMAX; LM ← LSMAX; RM ← RSMAX; END;
	WINDOW;
	DO	BEGIN "MOV"
		IF CMODE THEN TVREAD;
		L ← (POTABS(1,FLG)+2048) DIV 12;
		T ← (POTABS(2,I)+2048) DIV 18;
		IF FLG∨I THEN OUTSTR(" POT ERR ") ELSE
			BEGIN "UPDATE"
			R ← L+19;
			B ← T+19;
			IF L<LM THEN R←(L←LM)+19;
			IF R>RM THEN L←(R←RM)-19;
			IF B>BM THEN T←(B←BM)-19;
			IF T<TM THEN B←(T←TM)+19;
			IF B≠WB∨T≠WT∨L≠WL∨R≠WR THEN
				BEGIN "OK"
				WB ← B;
				WL ← L;
				WR ← R;
				WT ← T;
				WINDUP;
				IF CMODE THEN
					BEGIN "TVMOV"
					FLINE ← WT;
					LLINE ← WB;
					RSIDE ← WR;
					LSIDE ← WL;
					ADJTV;
					END "TVMOV" ELSE WINDOW;
				END "OK";
			END "UPDATE";
		END "MOV" UNTIL (I ← INCHRS)≥0;
	CHAR ← I;
	IF CMODE THEN RELEASE(15);
	BITS ← TS;
	EJINIT(OPNUM);
	INTPNT;
	WX ← (WL+WR) DIV 2;
	WY ← (WT+WB) DIV 2;
	MOVPTR(1,1);
	END;
α	read a disk file;

PROCEDURE DSKIN;
	BEGIN
	INTEGER EXTN, PPN, S, I, J, FAIL;
	LABEL REDO, ONLY;
	STRING STR;
	SAFE INTEGER ARRAY STOR, SIZ[1:25];
REDO:	OUTSTR("FILE=");
	FILE ← INCHWL;
	PICINI(1,CVFIL(FILE,EXTN,PPN),EXTN,PPN,FAIL,SIZ);
	IF FAIL THEN
		BEGIN
		OUTSTR("ERROR FOR FILE "&FILE&CRLF);
		GO TO REDO;
		END;
	S ← SIZ[5];
	IF S THEN
		BEGIN
		INTEGER ARRAY TITLE[1:S];
		STOR[5] ← GIOWD(TITLE)+1;
		PICRD(FAIL,STOR);
		STOR[5] ← 0;
		STR ← NULL;
		FOR I←1 STEP 1 UNTIL S DO STR←STR&CVSTR(TITLE[I]);
		OUTSTR("TITLE:"&STR&CRLF);
		END;
	STR ← NULL;
	J ← 0;
	FOR I←1 STEP 1 UNTIL 4 DO IF SIZ[I] THEN
		BEGIN
		STR ← STR&FILTER[I]&",";
		J ← J+1;
		END;
	IF ¬J THEN
		BEGIN
		OUTSTR("NO PICTURE"&CRLF);
		GO TO REDO;
		END;
	IF J=1 THEN GO TO ONLY;
	OUTSTR("PICTURES FOR FILTERS: "&STR&CRLF&"SPECIFY: ");
	STR ← INCHWL;
ONLY:	J ← STR;
	FOR I←1 STEP 1 UNTIL 4 DO IF J=FILTER[I] THEN DONE;
	IF I=5 THEN
		BEGIN
		OUTSTR("NO SUCH FILTER"&CRLF);
		GO TO REDO;
		END;
	RELCOR(TVWORD);
 	TVWORD ← GETCOR(SIZ[I]);
	STOR[I] ← TVWORD+1;
	PICRD(FAIL,STOR);
	RELEASE(1);
	TMAX ← FLINE;
	BMAX ← LLINE;
	LSMAX ← LSIDE;
	RSMAX ← RSIDE;
	STVFL ← STV ← ST ← TRUE;
	SLIM ← HOFF ← VOFF ← DRES ← CMODE ← FALSE;
	WX ← (LSIDE+RSIDE) DIV 2;
	WY ← (FLINE+LLINE) DIV 2;
	WT ← WY-9;
	WB ← WY+10;
	WL ← WX-9;
	WR ← WX+10;
	EJINIT(OPNUM);
	INTPNT;
	IF (BMAX-TMAX) MAX (RSMAX-LSMAX) > 20 THEN WINDOW;
	WINDUP;
	END;
α	command table

	first entry is command character
	second entry is argument flag
		0	no argument
		-1	optional argument
		1	required argument
	third entry is minimum value of argument, if any
	fourth entry is maximum value of argument, if any
	fifty entry is default value of argument, if optional
	sixth entry is flag bits
		1	clear operator display before calling
		2	mode display changed
		10	call operator after calling
		100	read TV after calling
		1000	camera mode only
		10000	4 bit image mode only
		100000	EDGE mode only
;
DEFINE CMDS=⊂
	XX(	M,  0,	0,	0,	0,   '101	),
	XX(	↑, -1,	0, WINLIN,	1,     '1	),
	XX(	↓, -1,	0, WINLIN,	1,     '1	),
	XX(	←, -1,	0, WINLIN,	1,     '1	),
	XX(	→, -1,	0, WINLIN,	1,     '1	),
	XX(	O, -1,	1,	2,	1,    '10	),
	XX(	C, -1,  1,	4,	1,   '103	),
	XX(	R,  0,	0,	0,	0,     '3	),
	XX(	Y,  1,	0,	1,	0,    '10	),
	XX(	Z,  1,	0,    999,	0,    '10	),
	XX(	B,  1,	0,	7,	0, '11101	),
	XX(	T,  1,	0,	7,	0, '11101	),
	XX(	S,  0,	0,	0,	0,  '1103	),
	XX(	F,  0,	0,	0,	0,  '1103	),
	XX(	W,  0,	0,	0,	0,  '1000	),
	XX(	H,  0,	0,	0,	0,  '1000	),
	XX(	N,  0,	0,	0,	0, '11103	),
	XX(	I,  0,	0,	0,	0, '11103	),
	XX(	D, -1,	0,     63,      1,  '1101	),
	XX(	?,  0,	0,	0,	0,	0	),
	XX(	V,  0,	0,	0,	0,	0	),
	XX(	T,  0,	0,	0,	0,'100000	),
	XX(	E,  0,	0,	0,	0,'100000	),
	XX(	A,  0,	0,	0,	0,'100000	),
	XX(	X,  0,	0,	0,	0,	0	)
	⊃, COMNO=⊂25⊃;
α  tables containing the above magic numbers and strings;

DEFINE XX(A,B,C,D,E,F)=⊂"A"⊃; PRELOAD_WITH CMDS;
SAFE INTEGER ARRAY COMSTR[1:COMNO];

DEFINE XX(A,B,C,D,E,F)=⊂B⊃; PRELOAD_WITH CMDS;
SAFE INTEGER ARRAY ARGFLG[1:COMNO];

DEFINE XX(A,B,C,D,E,F)=⊂C⊃; PRELOAD_WITH CMDS;
SAFE INTEGER ARRAY ARGMIN[1:COMNO];

DEFINE XX(A,B,C,D,E,F)=⊂D⊃; PRELOAD_WITH CMDS;
SAFE INTEGER ARRAY ARGMAX[1:COMNO];

DEFINE XX(A,B,C,D,E,F)=⊂E⊃; PRELOAD_WITH CMDS;
SAFE INTEGER ARRAY ARGDEF[1:COMNO];

DEFINE XX(A,B,C,D,E,F)=⊂F⊃; PRELOAD_WITH CMDS;
SAFE INTEGER ARRAY COMFLG[1:COMNO];

α	set up tv camera;

PROCEDURE CAMSET;
	BEGIN CMODE ← TRUE;
	WX ← 166;
	WY ← 128;
	TMAX ← WT ← FLINE ← WY-10;
	BMAX ← WB ← LLINE ← WY+9;
	LSMAX ← WL ← LSIDE ← WX-10;
	RSMAX ← WR ← RSIDE ← WX+9;
	ST ← SLIM ← 0;
	EJINIT(OPNUM);
	INTPNT;
	END;
α	main program begins here;

UNDERFLOW(0);
DAC ← FRAMES ← 0;
BLANKS ← "                    ";
EDGTST ← SLINK("TRACE")≠-1;
GODDT ← SLINK("DDT");
IF GODDT≤0 THEN GODDT ← 0;
	START_CODE
	MOVE 1,FRMDDT;
	MOVEM 1,COMDDT;
	END;
CMNDFLG← TRUE;
DRES ← FALSE;
OPNUM ← TVCAM ← 1;
TCLIP ← 0;
BCLIP ← 7;
CONF ← .90;
DIFF ← 1.5;
FILE ← NULL;
CAMSET;
TVWORD ← GETCOR(100);
OUTSTR("CAMERA INPUT?");
IF INCHWL="Y" THEN
	BEGIN "CAMINI"
	OUTSTR("CAMERA NUMBER=");
	TVCAM ← CVD(INCHWL);
	TVIN;
	END "CAMINI" ELSE DSKIN;
DPYTYP(TOP-(MODLIN+WINLIN+OPLIN+1)*YSIZ,2,4);
DOUT;
POSPAR;
TVPAR;
DINST;
DMOD;
DOPPAR;
DWIND;
DPNTR;
DPYOFF(F9);
NUMFLG ← INTEG ← FRAC ← FLTPNT ← FRACFLG ← HOFF ← VOFF ← 0;
OUTSTR("READY ");
α	command loop - decode input;

LOOP:	IF JOBOK(I)=2 THEN
		BEGIN
		IF ¬DVDTST THEN
			BEGIN DVDTST←TRUE; DMOD; END;
		END ELSE IF DVDTST THEN
			BEGIN DVDTST←FALSE; DMOD; END;
	IF CMODE THEN DPYON(F6) ELSE DPYOFF(F6);
	IF ¬LENGTH(CHAR) THEN CHAR ← INCHRW;
	I ← CHAR;
	CHAR ← NULL;
	IF I='15∨I='12∨I=" " THEN GO TO LOOP;
	IF I="." THEN
		BEGIN
		FRACFLG ← 1;
		GO TO LOOP;
		END;
	IF "0"≤I≤"9" THEN
		BEGIN "NUMIN"
		NUMFLG ← TRUE;
		I ← I-"0";
		IF FRACFLG THEN
			BEGIN "FRACTN"
			FRAC ← FRAC*10+I;
			FRACFLG ← FRACFLG*10;
			END  "FRACTN" ELSE INTEG ← INTEG*10+I;
		GO TO LOOP;
		END "NUMIN" ELSE FLTPNT←IF FRACFLG THEN
			INTEG+FRAC/FRACFLG ELSE INTEG;
	FOR J←1 STEP 1 UNTIL COMNO DO IF I=COMSTR[J] THEN DONE;
	IF J>COMNO THEN
ERR:		BEGIN OUTSTR("? "); GO TO NXT; END;
	IF ARGFLG[J] THEN
		BEGIN "FIXARG"
		IF ARGFLG[J]>0∧¬NUMFLG THEN GO TO ERR;
		IF ¬NUMFLG THEN INTEG ← FLTPNT ← ARGDEF[J];
		IF INTEG<ARGMIN[J] THEN INTEG ← FLTPNT ← ARGMIN[J];
		IF INTEG>ARGMAX[J] THEN INTEG ← FLTPNT ← ARGMAX[J];
		END "FIXARG";
	STATUS ← COMFLG[J];
	IF ((STATUS LAND '100000)∧¬EDGTST)∨((STATUS LAND '10000)∧¬(BITS=4))∨
		((STATUS LAND '1000)∧¬CMODE) THEN GO TO ERR;
	IF STATUS LAND 1 THEN DPYOFF(F8+F9);
α	command case statement;

	CASE J-1 OF
		BEGIN "COMNDS"
"M"		MOVE_WINDOW;
"↑"		MOVPTR(0,-INTEG);
"↓"		MOVPTR(0,INTEG);
"←"		MOVPTR(-INTEG,0);
"→"		MOVPTR(INTEG,0);
"O"		IF NUMFLG∧INTEG≠OPNUM THEN
			BEGIN
			EJINIT(OPNUM←INTEG);
			DPYDMP(DOPNUM,OUTDEC(OPNUM,5),5);
			END;
"C"		BEGIN "CAMERA"
		IF NUMFLG∧INTEG≠TVCAM THEN TVCAM ← INTEG;
		IF ¬CMODE THEN
			BEGIN "CMODE"
			RELCOR(TVWORD);
			BITS ← 4;
			TVWORD ← GETCOR(100);
			DRES ← 0;
			CAMSET;
			POSPAR;
			END "CMODE";
		END "CAMERA";
"R"		BEGIN DSKIN; POSPAR; DWIND; DPNTR; END;
"Y"		CONF ← FLTPNT;
"Z"		DIFF ← FLTPNT;
"B"		BEGIN BCLIP←INTEG; DPYDMP(BC,OUTDEC(BCLIP,5),6); END;
"T"		BEGIN TCLIP←INTEG; DPYDMP(TC,OUTDEC(TCLIP,5),6); END;
"S"		BEGIN "SIXBIT"
		BITS ← 6;
		DRES ← FALSE;
		OUTSTR("AVERAGE=");
		AVE ← CVD(INCHWL);
		OUTSTR("RANGES=");
		RANG ← CVD(INCHWL);
		INTPNT;
		END "SIXBIT";
"F"		BEGIN BITS←4;INTPNT;END;
"W"		WRITEOUT;
"H"		BEGIN "SHOW" INTEGER I;
		SAFE INTEGER ARRAY TVW[1:100];
		INTEGER BSAV, TSAV;
		TSAV ← TVWORD;
		BSAV ← BITS;
		TVWORD ← GIOWD(TVW);
		ADJTV;
		DO TVREAD UNTIL (I ← INCHRS)≥0;
		CHAR ← I;
		RELEASE(15);
		TVWORD ← TSAV;
		BITS ← BSAV;
		END "SHOW";
"N"		DRES ← 0;
"I"		DRES ← TRUE;
"D"		IF TVCAM≠1 THEN GO TO ERR ELSE
			BEGIN "DAC"
			AUTO_ACC ← (DAC+INTEG) DIV 2;
			AD ← DDACO(DAC←IF NUMFLG THEN INTEG ELSE DAC+INTEG);
			DPYDMP(DACS,OUTDEC(DAC,5),6);
			DPYDMP(ADS,OUTDEC(AD,5),6);
			END "DAC";
"?"		CMNDFLG ← ¬CMNDFLG;
"V"		DDVID("E;→1;"&(IF ((BMAX-TMAX) MAX (RSMAX-LSMAX))*4<950
			THEN "↔2" ELSE NULL)&"F1,1;L0");
"T"		GO TO NOIMP;
"E"		GO TO NOIMP;
"A"		BEGIN
NOIMP:		OUTSTR("NOT IMPLIMENTED YET ");
		GO TO NXT;
		END;
"X"		IF GODDT THEN
TODDT:			BEGIN LABEL L;
			ACPOGS(0);
			START_CODE
			JRST @GODDT;
FRMDDT:			JRST L;
			END;
L:			ACPOGS(FRAMES);
			GO TO NXT;
			END;
		END "COMNDS";

α	finish processing commands and return for more input;

	IF STATUS LAND '2 THEN DMOD;
	IF (STATUS LAND '100) THEN
		BEGIN
		IF CMODE THEN READTV;
		DWIND;
		DPNTR;
		END;
	IF STATUS LAND '10 THEN APLYOP;
NXT:	INTEG ← FRAC ← FLTPNT ← FRACFLG ← NUMFLG ← 0;
	GO TO LOOP;
	END "APPLY";